﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace YemekteyizLib.Bs
{
    public class SepetProvider
    {
        /// <summary>
        /// Private metot, getAktifByUye için yazılmıştır
        /// </summary>
        /// <param name="u"></param>
        /// <returns></returns>
        private static int SepetEkle(Uye u)
        {
            SqlCommand cmd = new SqlCommand("insert into Sepetler(UyeID, Tarih, OnaylandiMi) values(@UyeID, @Tarih, @Onay) select scope_identity()");
            cmd.Parameters.AddWithValue("@UyeID", u.ID);
            cmd.Parameters.AddWithValue("@Tarih", DateTime.Now.Date);
            cmd.Parameters.AddWithValue("@Onay", false);
            cmd.Connection = Tools.GetConnection();
            object id = cmd.ExecuteScalar();
            Tools.CloseConnection();

            if (id != null)
            {
                return Convert.ToInt32(id);
            }

            return 0;
        }

        /// <summary>
        /// Varolan bir sepete ürün eklemek için kullanılır.
        /// </summary>
        /// <param name="s"></param>
        /// <param name="u"></param>
        /// <param name="adet"></param>
        public static void UrunEkle(Sepet s, Urun u, int adet)
        {
            bool degisiklikVarMi = false;
            foreach (KeyValuePair<Urun, int> kvPair in s.Urunleri)
            {
                if (kvPair.Key.ID == u.ID)
                {
                    SepetUrunlerGuncelle(s, kvPair.Key, kvPair.Value + adet);
                    degisiklikVarMi = true;
                }
            }

            if (degisiklikVarMi)
            {
                s.Urunleri = null;
                return;
            }


            SqlCommand cmd = new SqlCommand("insert into SepetUrunler(SepetID,UrunID,Adet) values(@SepetID,@UrunID,@Adet)");
            cmd.Parameters.AddWithValue("@SepetID", s.ID);
            cmd.Parameters.AddWithValue("@UrunID", u.ID);
            cmd.Parameters.AddWithValue("@Adet", adet);
            cmd.Connection = Tools.GetConnection();
            cmd.ExecuteNonQuery();
            Tools.CloseConnection();
        }


        public static void SepetUrunlerGuncelle(Sepet s, Urun u, int yeniAdet)
        {


            SqlCommand cmd = new SqlCommand("update SepetUrunler set Adet=@Adet where SepetID=@ID and UrunID=@UrunID");
            cmd.Parameters.AddWithValue("@Adet", yeniAdet);
            cmd.Parameters.AddWithValue("@ID", s.ID);
            cmd.Parameters.AddWithValue("@UrunID", u.ID);

            if (cmd.Connection == null)
            {
                cmd.Connection = Tools.GetConnection();
            }
            cmd.ExecuteNonQuery();

            Tools.CloseConnection();
        }



        /// <summary>
        /// Üyenin aktif sepetini edinmek için kullanılır.
        /// Metot, aktif bir sepet yoksa üretir ve onu dönderir.
        /// </summary>
        /// <param name="u"></param>
        /// <returns></returns>
        public static Sepet GetAktifByUye(Uye u)
        {
            SqlCommand cmd = new SqlCommand("select * from Sepetler where UyeID = @uID and  OnaylandiMi = @onay");
            cmd.Parameters.AddWithValue("@uID", u.ID);
            cmd.Parameters.AddWithValue("@onay", false);

            cmd.Connection = Tools.GetConnection();

            SqlDataReader rdr = cmd.ExecuteReader();

            if (!rdr.HasRows)
            {
                rdr.Close();
                SepetEkle(u);
                return GetAktifByUye(u);
            }
            Sepet s = new Sepet();
            rdr.Read();
            s.ID = rdr.GetInt32(0);
            s.OnaylandiMi = false;
            s.Tarih = rdr.GetDateTime(3);
            s.Sahibi = u;


            cmd.Connection.Close();

            return s;

        }

        public static List<Sepet> GetByRestoran(Restoran r)
        {
            SqlCommand cmd = new SqlCommand("select distinct(su.SepetID) from SepetUrunler su join Urunler u on u.UrunID=su.UrunID join UrunGruplar ug on ug.GrupID=u.GrupID join Sepetler s on s.SepetID=su.SepetID where RestoranID=@ID and s.OnaylandiMi=@OK ");
            cmd.Parameters.AddWithValue("@ID", r.ID);
            cmd.Parameters.AddWithValue("@OK", true);
            cmd.Connection = Tools.GetConnection();
            SqlDataReader rdr = cmd.ExecuteReader();
            List<Sepet> donecek = new List<Sepet>();
            List<int> donecekIDler = new List<int>();
            while (rdr.Read())
            {
                donecekIDler.Add(rdr.GetInt32(0));
            }

            cmd.Connection.Close();



            foreach (int id in donecekIDler)
            {
                Sepet s = SepetProvider.getByID(id);
                donecek.Add(s);
            }

            return donecek;



        }

        public static void SepetOnayDegisti(Sepet sepet)
        {
            SqlCommand cmd = new SqlCommand("update Sepetler set OnaylandiMi = @o where SepetID = @ID");
            cmd.Parameters.AddWithValue("@o", sepet.OnaylandiMi);
            cmd.Parameters.AddWithValue("@ID", sepet.ID);

            cmd.Connection = Tools.GetConnection();

            cmd.ExecuteNonQuery();


            Tools.CloseConnection();

        }

        private static Sepet getByID(int id )
        {
            bool onaylandiMi = true;
            SqlCommand cmd = new SqlCommand("select * from Sepetler where SepetID=@id and Onaylandimi=@OK");
            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@OK", onaylandiMi);

            cmd.Connection = Tools.GetConnection();
            SqlDataReader rdr = cmd.ExecuteReader();
            Sepet s = new Sepet();

            if (rdr.HasRows)
            {
                rdr.Read();
                
                s.ID = id;

                s.Tarih = rdr.GetDateTime(3);
                int uyeID = rdr.GetInt32(1);
                s.OnaylandiMi = rdr.GetBoolean(4);
                cmd.Connection.Close();
                s.Sahibi = UyeProvider.GetByID(uyeID);
                
            }
            
            return s;
        }


    }
}
